|
このテクニカルノートは、Mac OS X において、GDB(Mac OS X のデバッガ)を使った、C、C++、Objective-C による一般的なデバッグ作業の方法(Java には専用のデバッガがあります)、および開発者にとって役に立つヒントとこつを説明します。
本文書は、GDB のすべてを説明する文書ではなく(詳細なマニュアルについては参考文献の節を参照)、GDB を初めて使う開発者が抱くと考えられる一般的な疑問に答えることを目的としており、今後必要なときに簡単に参照できるようになっています。また、プラットフォームに依存しないように書かれている GDB に関するほかの文献とは異なり、本書ははっきりと Mac OS X に的を絞っています。
本文書は、「Project Builder における GDB」、「GDB を使ったアプリケーションの接続、起動、終了」、
「ブレークポイント、バックトレース、逆アセンブル」、「その他の重要項目とこつ」の 4 つの節に分かれています。
[2001 年 12 月 7 日]
|
Project Builder における GDB
Project Builder は、Mac OS X で使用するためのアップル独自の統合開発環境(IDE)で、C、C++、Objective-C、Objective-C++、および Java による開発をサポートしています。 Project Builder はそれ自体で、機能の充実した GUI 開発環境を提供していますが、すべての仕事を単独でこなすようには作られていません。開発に携わる多くの人にとってなじみのあるオープンソースのツールも使います。これらのツールの 1 つが GDB で、IDE にデバッグ情報を提供するために Project Builder によって使われます。したがって、Project Builder を使ってアプリケーションをデバッグするときは、実際には GDB とやり取りします。アプリケーションをデバッグするとき、ウィンドウは次のようになっています。

図 1 Project Builder のデバッグ用インタフェース
Project Builder 自体も、アプリケーションを対象にブレークポイント(ソースの左の余白にある小さな矢印)の設定、ステップ実行、コードの表示などを行うための GUI コントロールを提供しています。ステップ実行、一時停止、継続などのためのツールバーボタンが提供されています。ブレークポイントに到達したときには、簡単に検査できるように、スタックフレームがスコープ内の変数と一緒に提示されます。
しかし、時には、Project Builder のユーザインタフェースがまだ提供していないデバッガ機能を利用したいときもあるでしょう。このような場合には、GDB と直接やり取りします。これは、ツールバーのすぐ下にある「Console」(コンソール)タブから行えます。このタブを表示することにより、Project Builder 自体が対話している進行中の GDB セッションと対話できます。つまり、自分で GDB をアプリケーションにアタッチしたり、ブレークポイントを設定したりなどする必要はなく、その代わりに、変数を様々な書式で表示したり、逆アセンブルを行ったりするなど、Project Builder が提供していない機能に専念できます。このテクニカルノートの大部分の内容は、この方法で GDB を使用する場合にも適用されます。この併用アプローチ、つまり、GDB を直接使う方法と Project Builder を介して使う方法を併用するのは、大部分の作業が IDE の機能で十分だけれども、いくつかの作業で GDB に直接 アクセスする必要がある場合に適しています。

図 2 Project Builder のコンソールに help と入力すると GDB の標準のヘルプが表示される
新しいバージョンの Project Builder に、GUI ベースのデバッグ機能がもっと多く実装されるのを待つ間、現在 Project Builder の GUI からできることの 1 つは、まだ気付いていない人もいるかもしれないバージョン 1.1 で追加された機能の 1 つを使うことです。その新機能とは、デバッガペインで Control を押した状態でオブジェクトをクリックするとコンテキストメニューに表示される 「Print Description to Console」(説明をコンソールに出力する)です。これは、CoreFoundation(CF)- ベースのオブジェクトだけでなく、Objective-C の NS オブジェクトにも有効です。このメニュー項目を選択すると、オブジェクトの内容が自動的にコンソールペインに出力されます。

図 3 「Print Description to Console」(説明をコンソールに出力する)を使って CF タイプまたは NS タイプのオブジェクトを出力
まだ使い慣れていないという人は、Project Builder を使った一般的なデバッグ方法の詳細について、Project Builder のヘルプ(Project Builder の Help メニューから参照できます)をいつでも参照できます。以降では、開発時に、Project Builder が必要なデバッグ機能が利用できないことがわかり、煩わしいくらい何度も「Console」(コンソール)タブを利用している状況を考えてみます。そのようなときこそ、Terminal を実行して、Project Builder をまったく介さずに、GDB と直接対話します。このテクニカルノートではこの方法を使います。次は、GDB の使用に関する規則および使い方の基本の説明です。
先頭に戻る
GDB を使ったアプリケーションの接続、起動、終了
コマンドに関する規則
- 本文書全体を通じて、GDB コマンドを、「
(b)reak 」というように、コマンドの最初の文字または数文字を括弧で囲んで示しています。GDB には、タブキーを使った自動入力機能および自動コマンド拡張機能があるので、コマンド名の必要最小限の文字を入力するだけで、コマンドが一意に決まります。括弧の中の文字はコマンドの起動に必要最小限の文字です。したがって、たとえばコマンドプロンプトで b を入力することは、break を入力することと同じです。本来ならコマンドが一意に決まらない特別にハードコードされているコマンドもあります。それらは、頻繁に使用するコマンドにすばやくアクセスできるようにします。
- 必要に応じて引数を取る GDB コマンドも紹介します。引数は、
(d)elete [ブレークポイント] のように大括弧内に入れられます。
- GDB コマンドは継続性があります。つまり、空行で Return を押すと通常では、GDB は直前のコマンドを再度実行します。その結果入力の手間が省けます。いくつかのコマンド(必要に応じて以下で説明)はこのようにして自動的に再実行したときに新しい引数まで自動的に作成します。
- 上向き矢印を押すと、コマンドラインの場合とまったく同じように、直前の GDB コマンドに戻ります。
- GDB では、「
help [コマンド名] 」、または単に「help 」と入力するだけでいつでもヘルプを参照できます。GDB の man ページにもいくつかの基本事項が掲載されています。
デバッグを行うための GDB の起動/終了とアプリケーションのアタッチ/実行
- GDB は、「
gdb 」と入力するだけで、コマンドラインから起動することができます。
- 特定のアプリケーションを対象に GDB を実行するには、「
gdb バイナリのパス 」を入力するか、対象のアプリケーションがすでに実行中の場合は、「gdb バイナリのパス プロセス-id 」を入力します。
- デバッグを行うために、GDB を現在実行中のアプリケーションにアタッチする一般的な方法は、GDB を立ち上げ、その後「(
at)tach プロセス-id 」を入力するだけです。たとえば、Project Builder でアプリケーションを起動し、デバッグする必要があることに気付けば、コマンドラインから、GDB をアプリケーションにアタッチできます。
- すでに実行中のプロセスにアタッチするとき、GDB は必ず、必要なセットアップの機会を提供するために、そのプロセスを一時停止します。「
(c)ontinue 」と入力すれば、プロセスの実行が続けられます。
- すでに実行中のプロセスにアタッチしたときに、GDB が、式を評価するために使用するプログラミング言語を自動的に決定できない場合があります。これは、Objective-C で記述された Cocoa プログラムをデバッグするときに頻繁に起こります。この問題の最も一般的な現象は、アタッチ後に条件付きのブレークポイントなどの式を使おうとしたときに発生するおかしな解析エラーです。これに対する解決策は、どの言語を使用するかを知らせるために、アタッチ後に「
set language objective-c 」を入力することです。
- アプリケーションバイナリのパスを渡して、GDB を起動した場合は、アプリケーションを起動するために、
(r)un [アプリケーションに渡す引数] コマンドを呼び出す必要があります。
- 作業を終え GDB を終了するには
(q)uit を入力します。
GDB での CFM アプリケーションの起動
- CFM(Code Fragment Manager)アプリケーション(Mac OS 9 対応の Carbon アプリケーションが使用する形式)は、Mac OS X 上で動作するには LaunchCFMApp アプリケーションに依存します。したがって、GDB の下で CFM アプリケーションをデバッグするためには、LaunchCFMApp へのパスを渡して GDB を起動し、その後 run コマンドを使って、引数として CFM バイナリのパスを渡します。
- 各種のシンボルファイルが見つからないという警告は、無視しても大丈夫です。GDB は単に、Mach-O バイナリが提供するだけの情報を CFM が提供していないと通知しているにすぎません。
リスト 1 ここでは、LaunchCFMApp をロードし、それを使用して GDB の下で iTunes を実行しています。実行を停止するために Control + C を押し、その後 GDB を終了しています。
[rivendell:‾] mformica% gdb /System/Library/Frameworks/Carbon.framework/Versions
/A/Support/LaunchCFMApp
GNU gdb 5.0-20001113 (Apple version gdb-200) (Tue Oct 9 18:01:34
GMT 2001) (UI_OUT)
Copyright 2000 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "powerpc-apple-macos10".
Reading symbols for shared libraries .... done
(gdb) run /Applications/iTunes.app/Contents/MacOS/iTunes
Starting program: /System/Library/Frameworks/Carbon.framework/Versions/A/
Support/LaunchCFMApp /Applications/iTunes.app/Contents/MacOS/iTunes
[Switching to thread 1 (process 1115 thread 0x1603)]
Reading symbols for shared libraries
........................................... done
Reading symbols for shared libraries . done
unable to open symbol file: DrawSprocketLib: No such file or directory.
warning: Unable to read symbols from "DrawSprocketLib"; reading from memory.
Reading symbols for shared libraries . done
.
.
.
^C
Program received signal SIGINT, Interrupt.
0x70001308 in mach_msg_overwrite_trap ()
(gdb) q
The program is running. Exit anyway? (y or n) y
|
|
先頭に戻る
ブレークポイント、バックトレース、逆アセンブル
通常のブレークポイントの設定/表示/削除、ステップ実行、継続
- 「
(b)reak 関数名 」、「 (b)reak ソースファイル名:行番号 」、「(b)reak 行番号 」(ソーステキストが表示された最後のファイルが対象とみなされる)、または「(b)reak ソースファイル名:関数名 」を入力することで、GDB でブレークポイントを設定できます。次に例を示します。
- C 関数:
b foo
- C++ メソッド:
b Foo::bar (該当するものが複数ある場合には選択肢が提示されます)
- Objective-C メソッド:
b -[Foo bar] 、またはアクションメソッドの場合は、b -[Foo bar:]
- 各ブレークポイントは番号付けされます。「
(i)nfo break 」を入力することにより現在あるすべてのブレークポイントのリストを取得できます。
- 「
delete 1 2 3 」のように、「(d)elete スペースで区切られたブレークポイントの番号 」を入力するか、「delete 1-3 」のように、ダッシュを使ってブレークポイントの番号の範囲を入力することによって、1 つあるいは複数のブレークポイントを削除できます。
- 「
(dis)able スペースで区切られたブレークポイントの番号 」または「(en)able スペースで区切られたブレークポイントの番号 」を入力することによってブレークポイントを一時的に無効または有効にすることもできます。
- ブレークポイントで停止した後、プログラムの実行を継続するには 「
(c)ontinue 」を入力します。
- ブレークポイントで停止した後、プログラムの次の行をステップオーバーするには、「
(n)ext 」を入力します。
- ブレークポイントで停止した後、プログラムの次の行にステップインするには、「
(s)tep 」を入力します。
- 設定するブレークポイントの位置またはシンボルが、まだプログラムのアドレス空間にない場合(まだロードされていないがロード可能なバンドル内にある場合など)は、「
fb 関数名 」コマンドを使って「将来のブレークポイント」を設定できます。
- Control + C を押すと、プログラムは一時停止され、GDB プロンプトに戻り、入力可能な状態になります。
条件付きブレークポイントの使い方
- 「
(b)reak 関数名 if 条件 」(ここで「条件」は何らかの式)を入力することによって、条件付きブレークポイントを設定できます。逆に、「条件 ブレークポイント番号 式 」(ここで「ブレークポイント番号」は操作対象のブレークポイントの番号)を入力することによって、既存のブレークポイントの条件を付加/変更できます。たとえば、「b foobar if x>25 」または 「condition 3 x>25 」と入力できます。
- 条件には、関数呼び出しを含めることができます。たとえば、「
b foobar if bigEnough(x) 」と入力できます。
- 詳細については、GDB の式について説明している節を参照してください。システムの関数またはメソッドへの呼び出しを含む式(条件付きブレークポイントなど)は、GDB が実行できるように、関数/メソッドの戻り型を明示的に型変換する必要があるかもしれません。たとえば、「
b 9 if (bool)[(NSString *)[文字列の記述] isEqual:@"Hi there!"] 」などのようにする必要があるでしょう。
- 条件は、「
条件 ブレークポイント番号 」を入力することによってブレークポイントから削除できます。
- ウォッチポイントに関する注意:ウォッチポイントは現在、ハードウェアウォッチポイントがないこと、および特定の PPC 命令と競合することから、Mac OS X ではあまり有効ではありません。したがって、ウォッチポイントは避けた方がよく、このテクニカルノートでは説明しません。代わりに条件付きブレークポイントを使うことによって同様の機能を得ることができます。
バックトレース、スタックフレームの選択、逆アセンブル
- ブレークポイントで停止したときに、現在の位置に到達するまでに、プログラムがそれまでに実行したステップを見たい場合もよくあります。GDB は、そのためのリストを提供します。GDB は、「
backtrace [フレーム数] 」、またはただ「bt [フレーム数] 」と入力すれば、現在実行中のフレーム(フレーム 0)から始まり、たとえばフレーム 1、フレーム 2 という具合に、スタックをさかのぼって、スタックフレームをバックトレースとして提示してくれます。これは、GDB で最もよく使うコマンドの 1 つです。任意で指定できるフレーム数引数は、backtrace コマンドに、リスト表示のために呼び出しチェーンの中でスタックの階層をいくつ上がるかを伝えます。この引数は、プログラムの先頭近くの重要でないスタックフレームを表示するためにバックトレース情報が Terminal ウィンドウでスクロールされて消えてしまわないようにするためにこの引数はよく使います。
- デフォルトでは、フレーム 0 が、現在選択されているフレームとなりますが、プログラマは、「
frame 番号 」を入力することにより、特定のフレーム番号を選択し、関連するインスタンス変数をスコープ内に入れることができます。
- 「
info locals 」または「info args 」を入力することによって、プログラムで現在実行されているルーチンのローカル変数および引数に関する情報を得られます。
- 「
info line [行番号またはルーチン名] 」を入力することによって、ソースコードの行またはルーチンのメモリアドレスの範囲を調べることができます。行番号またはルーチン名を省略した場合には、現在の行が指定されたものとみなされます。
- 「
(disas)semble 」と入力するだけで、現在の停止位置のルーチンを逆アセンブルできます。
- また、ほかのメモリ領域の逆アセンブルは、「
info line 」によって対象にしたいメモリアドレスの範囲を取得した後、「(disas)semble 開始アドレス, 終了アドレス 」を入力することで可能です。終了アドレスは省略可能です。また、指定した行だけでなく、その周辺の行(通常はそれらの行を含むルーチン全体)も逆アセンブルされます。
リスト 2 ここでは、コードをリスト表示(次節で説明)し、21 番目の行のメモリアドレスを取得した後、その行およびその行を含む Objective-C のアクションメソッドを逆アセンブルします。
(gdb) list 20,25
20
21 for (i=0;i<10;i++)
22 NSLog([someObject whichOne:i]);
23 }
24
25 @end
(gdb) info line 21
Line 21 of "MyObject.m" starts at address 0x3dcc <-[MyObject
myAction:]+72> and ends at 0x3de4 <-[MyObject myAction:]+96>.
(gdb) disassemble 0x3dcc
Dump of assembler code for function -[MyObject myAction:]:
0x3d84 <-[MyObject myAction:]>: mflr r0
0x3d88 <-[MyObject myAction:]+4>: stmw r30,-8(r1)
0x3d8c <-[MyObject myAction:]+8>: stw r0,8(r1)
.
.
.
0x3dcc <-[MyObject myAction:]+72>: li r0,0
.
.
.
|
|
先頭に戻る
ソースファイル、ルーチン、式、変数
ソースファイルのリスト表示と扱い方
ここまでくれば、アプリケーションにおけるブレークポイントの扱い方はわかりました。しかし、たとえば、ブレークポイントを置くべき重要な関数の名前を忘れたとします。または、ブレークポイントの周辺のソースコードをリスト表示したいときはどうすればよいのでしょうか?次にその方法を示します。
- 特定のファイルのソースコードを表示するには、「
(l)ist ファイル名:開始行,終了行 」を使います。その他の例を次に示します。
- 特定のファイルの特定の行をリスト表示します:
list ファイル名.c:1,5
- 現在のファイルの特定の行をリスト表示します:
list 20,30
- 特定の Objective-C メソッド(およびその周辺の行)をリスト表示します:
list -[オブジェクト アクション:]
- 特定のファイルの特定の関数をリスト表示します:
list MyFile.cpp:FooFunction
- 現地点(ブレークポイントなど)から先の行をリスト表示します:
list +
- 現地点(ブレークポイントなど)までの行をリスト表示します:
list -
GDB のルーチン/式
- GDB では、「
call 関数名 」を入力することによって、任意の関数/メソッドを呼び出せます。
- アップルのシステムフレームワークの 1 つからの関数/メソッドの呼び出しを含む式が条件付きブレークポイントなどにある場合、おそらくその呼び出しには、戻り値の型に関する情報は含まれていないでしょう。これは一般的に、AppKit または Foundation フレームワークに対して CFShow などの CoreFoundation 呼び出しまたは Objective-C 呼び出しを行う場合はその典型です。GDB が型情報を利用できない場合には、明示的に関数/メソッドの呼び出しを正しい戻り値の型に型変換しない限り、GDB は関数/メソッドを実行できません。次に例を示します。
- 条件付きブレークポイントに NSString の呼び出しを含めます:
b 9 if (bool)[(NSString *)[文字列の記述] isEqual:@"Hi there!"]
- CFShow を呼び出します:
call (void)CFShow(何らかの CF オブジェクト)
オブジェクト、変数、ルーチンの値の表示と設定
- 特定の書式で変数または式の内容を表示するための基本の形式は、「
(p)rint [/書式] [式] 」です。書式指定子を省略した場合のデフォルトの書式は、GDB が変数のデータ型に基づいて類推します。たとえば、「print /d 変数 」を入力すれば、符号付きの 10 進数として表示させることができます。各種の書式指定子を渡すことによって、さまざまな書式で結果を表示させることができます。次に最も一般的に使用される書式指定子を示します。
/x |
変数/式を 16 進数として解釈/出力 |
/d |
符号付き 10 進数として解釈/出力 |
/u |
符号なし 10 進数として解釈/出力 |
/c |
文字定数として解釈/出力 |
/f |
浮動少数点として変換/出力 |
/a |
直前のシンボルからのオフセットとして 16 進数のアドレスとして解釈/出力 |
- 書式指定子を、特定のデータ型への明示的な型変換と併せて、自由に使えます。GDB は、複雑なデータ型でもおおむね正しく表示します。次に例を示します。
(gdb) list 18,18
18 char * someString="Hello, World!";
(gdb) p someString
$2 = 0x3e70 "Hello, World!¥000"...
(gdb) p (char[5])*someString
$3 = "Hello"...
|
- 知っておくとよいのは、GDB コマンドは / を含まないので、「print」と 「/書式」の間には実際にはスペースは必要ないということです。たとえば、「
p/x 変数 」のように記述できます。
- GDB で変数または式を表示させると、結果は「$任意の数字 = 値」の書式で出力されます。「$任意の数字」は、値の履歴を表し、デバッグセッションを通じて増加します。適切な 「$数字」を参照することによって、後で再び、その値を使って作業できます。
- 「
(p)rint /書式 」を指定し、式を省略すれば、値の履歴にある最後の値を別の書式で出力できます。
- 「
whatis [変数] 」を入力すれば、変数の型がわかります。次に例を示します。
(gdb) list 18,18
18 char * someString="Hello, World!";
(gdb) whatis someString
type = char *
|
- Cocoa と CoreFoundation の不透過オブジェクトは、データへのポインタではなくオブジェクトなので、print コマンドを使ってもうまく出力されません。これらのオブジェクトには、print object(オブジェクト)の省略形、
po コマンドを使ってオブジェクトの記述を出力します。CoreFoundation オブジェクトの場合は、CFShow() を呼び出すことができます。次に例を示します。
(gdb) list 18,19
18 CFStringRef testString=CFSTR("just a test");
19 NSString *someString=@"Hi there!";
(gdb) po someString
Hi there!
(gdb) call (void)CFShow(someString)
just a test
|
- GDB の中でアプリケーションを起動するのではなく、すでに実行中のプログラムに GDB の中でアタッチしてデバッグしているとき、stdout と stderr は、Terminal には接続されません。これらは、アプリケーションの起動方法に応じて、コンソールまたは Project Builder の「Run」(実行)タブが接続先となります。したがって CFShow を呼び出しても、Terminal に結果が出力されず煩わしいかもしれません。GDB において、次のようにすれば、stdout と stderr の接続先を Terminal ウィンドウに変更できます。
リスト 3 ここでは、stdout と stderr への既存の接続を閉じ、現在のシェルセッションで使われているデバイスを調べ、接続を開きなおして、出力のリダイレクト先となる正しいデバイスを渡します。
(gdb) call (void) close(1)
(gdb) call (void) close(2)
(gdb) shell tty
/dev/ttyp1
(gdb) call (int) open("/dev/ttyp1", 2, 0)
$1 = 1
(gdb) call (int) open("/dev/ttyp1", 2, 0)
$2 = 2
|
|
- 変数の値は、
set var x=5 のように、「set var 変数名=値 」を入力することによって設定します。
その他の重要項目とこつ
次に、GDB で作業するにあたって、調べておいた方がよい重要な項目、および役に立つヒントとこつをいくつか示します。
- GDB 用の MacsBug プラグイン:GDB をより MacsBug 風にするための GDB プラグインがあります。このプラグインおよびその詳細情報については、Mac OS X Developer Tools がインストールされたシステムの /usr/libexec/gdb/plugins/MacsBug で見つけることができます。MacsBug をよく知っているユーザを対象とした GDB の使用法に関する詳細情報については、テクニカルノート TN 2030 を参照してください。
- ブレークポイントに関するヒント: Cocoa アプリケーションをデバッグするときに行うと役に立つのは、不具合のある位置でプログラムを調べることができるように、ブレークポイントを -[NSException raise] に設定することです。
- ブレークポイントに関するヒント:GDB と一緒に MallocDebug を使って、メモリの二重解放バグを追跡するときは、malloc_printf に対してブレークポイントを設定すると非常に役に立ちます。なぜなら、その関数は、メモリが二重解放されると、stderr を使って警告しようとし、ブレークポイントに到達するので、メモリが二重解放されたまさにその場所でバックトレースを取得できます。
- 簡易変数: GDB では、簡易変数が設定されたり、その設定をしたりできます。簡易変数はすべて $ で始まりますが、おそらくコマンドを実行したときや、変数を出力したときにその存在に気付いたことでしょう(変数を実行すると GDB は必ず、$3='Hello'...のように、簡易変数の値に設定します)。簡易変数を設定したら、それをプログラムのほかの部分で参照して、同じ変数の新しい値と古い値を比較したり、その他のコマンドへの入力の一部として使ったりできます。毎回長い文字列全部を入力せずに済むので、複雑なデータ構造に入っているときなどにしばしば役に立ちます。たとえば、
print ((TkWindow *) ((Interp *) interp)->mainWin)->display の代わりに、次のように入力できます。
(gdb) print (Interp *) interp
$1 = ...
(gdb) print ((TkWindow *) $1)->mainWin
$2 = ...
(gdb) print $2->display
|
- プログラムの実行位置:「
jump 行番号 」コマンドを使えば、GDB に特定の行で実行を継続するように伝えることができます。このコマンドは注意して使わなければなりません。なぜなら、プログラムの実行位置を間違った位置に変更すると、動作がおかしくなる可能性があるからです。
- メモリの調査: GDB には、
(p)rint に似た x コマンド(x は examine(調査)の略)があり、特定の範囲のメモリ領域を調査したり、さまざまな単位でメモリを分割したりするのに役立ちます。s (ヌルで終了する文字列)と i (マシン命令)の 2 つの追加の書式指定子があります。
- 式の自動表示: GDB は、「
display [/書式] 式 」コマンドを使って、ブレークポイントで停止するたびに自動的に特定の式を表示するように設定できます。「info display 」を使えば、表示する式のリストを取得でき、特定の自動表示項目を削除するには、「undisplay 表示項目番号 」を使います。
- スレッドのサポート: マルチスレッドのアプリケーションの場合は、「
thread スレッド番号 」を使って、コンテキストを特定のスレッドに切り替えたり、「info threads 」を使って、存在しているスレッドを調べたり、「thread apply [スレッド番号] [all] コマンド 」を使って、特定のコマンドを特定の範囲のスレッドに適用したりできます。たとえば、「thread apply all bt 」は、アプリケーションのすべてのスレッドのバックトレースをダンプします。
- GDB には、このテクニカルノートでは記述できないほど多くの機能があります。ソースレベルでのデバッグのニーズのほとんどは、本文書で紹介したコマンドで満たせますが、必要に応じてマニュアルを調べることをいとわないでください。おそらく必要とすることを行ってくれるコマンドやオプションがあるでしょう。
先頭に戻る
参考文献
Richard Stallman et al, Debugging with GDB, Free Software Foundation, March 2000
Technical Note TN2030, "GDB for MacsBug Veterans"
先頭に戻る
ダウンロード
先頭に戻る |